curl_easy_init()
和curl_easy_cleanup()
1 curl_easy_init()
#include <curl/curl.h>
CURL * curl_easy_init();
调用这个函数是使用libcurl发起http请求的第一步,在调用成功后,这个函数会返回一个“curl easy handle”,在往后的程序中,调用其他的curl easy接口都需要这个handle作为输入。在程序结束需要关闭的时候必须要调用curl_easy_cleanup()
。
在程序中curl_easy_init()
和curl_easy_cleanup()
总是成对出现。
如果在之前的程序中,你并没有调用curl_global_init()
,那么curl_easy_init()
会在内部调用它。然而,由于curl_global_init()
不是线程安全的,如果这种场景发生在多个线程同时调用curl_easy_init()
,程序可能会发生资源泄露问题---由于curl_global_init()
和curl_global_cleanup()
没有成对出现导致的。
因此,libcurl官方建议在合适的地方显式调用curl_global_init()
和curl_global_cleanup()
,不要依靠curl_easy_init()
来触发curl_global_init()
。
2 curl_easy_cleanup()
#include <curl/curl.h>
void curl_easy_cleanup(CURL * handle );
这个函数是和curl_easy_init()
成对使用的,用来关闭一个“easy”会话(session),在调用时,需要传入需要关闭的“handle”即之前curl_easy_init()
的返回值。
调用这个函数会关闭掉对应“handle”所打开的所有连接(除非这个连接被多个“handle”使用)。
因为不断地init和cleanup会对性能有一些影响。所以,有一个建议是:使用同一个“handle”来处理多个连接。
对于一些协议,如FTP,POP3以及IMAP,由于这些协议的实现细节---在关闭的过程中会有“req->resp->req->resp”这样的流程。在这些场景中,调用curl_easy_cleanup()
会导致之前设置的一些回调函数被调用。